const _ = require('lodash')

module.exports = app => {
    class MenuController extends app.Controller {

        // 1. 获取菜单树 （分类类型） 列表
        async classify(){
            //console.log('useid',ctx.state.user.id)
            try {
                const list = await this.ctx.service.menu.classify()
                this.ctx.body = {
                    code: 200,
                    success: true,
                    data: list
                }
            } catch (error) {
                console.log(error)
            }
        }

        // 2. 获取菜单树 （分类类型） 查询
        async getClassify(){
            try {
                const query = this.ctx.query
                const list = await this.ctx.service.menu.getClassify(query)
                this.ctx.body = {
                    code: 200,
                    success: true,
                    data: list
                }
            } catch (error) {
                console.log(error)
            }

        }

        // 3. 获取菜单树 （树形类型） 列表
        async list() {
            try {
                const query = this.ctx.query
                const menu = await this.ctx.service.menu.list(query)
                const file = await this.ctx.service.file.list(query)
                let result = _.concat(menu, file)
                // TODO 暂时先不做排序 需要做的话 在这做排序操作
                result = _.sortBy(result ,  ['createTime']);
                this.ctx.body = {
                    code: 200,
                    success: true,
                    data: result
                }
            } catch (error) {
                console.log(error)
            }
        }

        // 4. 菜单树 （树形类型） 新增
        async add() {
            try {
                const body = this.ctx.request.body
                const result = await this.ctx.service.menu.addDir(body)
                this.ctx.body = {
                    code: 200,
                    success: true,
                    data: result
                }
            } catch (error) {
                console.log(error)
            }
        }

        // 5. 菜单树 （树形类型） 初始化
        async initAdd() {
            try {
                const body = this.ctx.request.body
                // TODO 初始化逻辑可以是使用 用户名 或者 自定义名称 作为初始化文件夹名称
                const result = await this.ctx.service.menu.initAdd(body)
                this.ctx.body = {
                    code: 200,
                    success: true,
                    data: result
                }
            } catch (error) {
                this.ctx.body = {
                    code: 400,
                    success: false,
                    data: error
                }
            }
        }

        // 6. 菜单树 （树形类型） 移除
        async remove() {
            try {
                const dirId = this.ctx.query.dirId
                const result = await this.ctx.service.menu.removeDir(dirId)
                this.ctx.body = {
                    code: 200,
                    data: result,
                    success: true,
                }
            } catch (error) {
                console.log(error)
            }
        }

        // 7. 支持文件/文件夹 单个或多个删除
        async delete (){
            try {
                const body = this.ctx.request.body
                const result = await this.ctx.service.menu.delete(body)
                let res = {}
                if(Array.isArray(result)){
                    res.deletedCount = _.reduce(result, (sum, item) =>  sum + item.deletedCount, 0)
                }else{
                    res.deletedCount = result.deletedCount
                }
                this.ctx.body = {
                    code: 200,
                    data: res,
                    success: true,
                }
            } catch (error) {
                console.log(error)
            }
        }

        // 8. 支持文件/文件夹 重命名（同一个接口）
        /**
         * @param {String} type 文件类型(文件/文件夹)
         * @param {String} old_name 旧文件/文件夹名
         * @param {String} new_name 新文件/文件夹名
         * @param {String} targetId 文件/文件夹名id
         */
        async rename(){
            try {
                const body = this.ctx.request.body
                const result = await this.ctx.service.menu.rename(body)
                this.ctx.body = {
                    code: 200,
                    data: result,
                    success: true,
                }
            } catch (error) {
                
            }
        }
    }
    return MenuController
}
